package br.com.senai.dao;

import br.com.senai.config.HibernateUtil;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Maysa
 */
abstract class GenericDAO<T> {

    protected Session session;
    protected String classe;
    protected Class classeCri;

    public void abrirSessao() {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
    }

    public void fecharSessao() {
        session.getTransaction().commit();
        session.close();
    }

    public void salvar(Object o) {
        abrirSessao();
        session.save(o);
        fecharSessao();
    }

    public T buscarPorId(Serializable id) {

        abrirSessao();
        T entity = (T) session.get(classeCri, id);
        fecharSessao();
        return entity;

    }

    public void atualizar(T object) {
        abrirSessao();
        session.update(object);
        fecharSessao();
    }

    public void deletar(Object o) {
        abrirSessao();
        session.delete(o);
        fecharSessao();
    }

    public List<T> listar() {
        abrirSessao();
        List<T> lista = session.createQuery("from " + classe).list();
        fecharSessao();
        return lista;
    }

    public List listarCriteria(Criteria criteria) {
        List objetos;
        objetos = criteria.list();
        fecharSessao();

        return objetos;
    }

    public Object listarCriteriaUnique(Criteria criteria) {
        Object objeto;
        objeto = criteria.uniqueResult();
        fecharSessao();

        return objeto;
    }

    // Criterias
    public Criteria restricaoEqual(String campo, String valor, boolean unique) {
        abrirSessao();
        Criteria criteria = session.createCriteria(classeCri);
        criteria.add(Restrictions.eq(campo, valor));
        if (unique) {
            criteria.uniqueResult();
        }

        return criteria;
    }

}
